package cn.wilson.hrm.service.impl;

import cn.wilson.hrm.constant.RedisConstant;
import cn.wilson.hrm.domain.CourseType;
import cn.wilson.hrm.feign.client.RedisFeignClient;
import cn.wilson.hrm.mapper.CourseTypeMapper;
import cn.wilson.hrm.service.ICourseTypeService;
import cn.wilson.hrm.utils.AjaxResult;
import cn.wilson.hrm.vo.CrumbsVo;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author wilson.liu
 * @since 2020-04-18
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {



    @Autowired
    private RedisFeignClient redisFeignClient;

    //查询课程分类加入缓存逻辑
    private List<CourseType> selectCourseTypeCache(){
        List<CourseType> courseTypes = null;

        AjaxResult ajaxResultFromRedis = redisFeignClient.get(RedisConstant.KEY_COURSETYPE);
        //正常拿到数据
        if (ajaxResultFromRedis.isSuccess() &&ajaxResultFromRedis.getResultObj() != null){
            //从redis中查询课程分类
            //如果redis中有课程分类  取出返回
            String courseTypeJson = ajaxResultFromRedis.getResultObj().toString();
            //把json数据转化为list
            return JSON.parseArray(courseTypeJson,CourseType.class);
        }
        //如果redis中没有课程分类  去mysql查询，并同步redis
        courseTypes = baseMapper.selectList(null);
        //同步一份到缓存中
        redisFeignClient.set(RedisConstant.KEY_COURSETYPE,JSON.toJSONString(courseTypes));
        //返回课程分类
        return courseTypes;
    }



    @Override
    public List<CourseType> treeData() {
        //结果list
        ArrayList<CourseType> parentCourseTypeList = new ArrayList<>();

        //1、查询出所有的课程分类
        List<CourseType> allCourseType = selectCourseTypeCache();

        allCourseType.forEach(currentCourseType->{
            //2、把一级分类查询出来装到list中
            if (currentCourseType.getPid() == 0){
                //currentCourseType  到这里就是一级
                parentCourseTypeList.add(currentCourseType);
            }else {
                //currentCourseType 到这里可能是二级也可能是三级
                for (CourseType parentCourseType : allCourseType) {
                    //父分类的id = currentCourseType.getPid()
                    if (currentCourseType.getPid().equals(parentCourseType.getId())){
                        //3、加入自己父分类的children
                        parentCourseType.getChildren().add(currentCourseType);
                        break;
                    }
                }
            }
        });


        return parentCourseTypeList;
    }

    /**
     *      面包屑查询
     * @param courseTypeId
     * @return
     */
    @Override
    public List<CrumbsVo> crumbs(Long courseTypeId) {
        //根据传过来的id到数据库查询课程分类
        CourseType courseType = baseMapper.selectById(courseTypeId);

        //获取到当前分类的path  也可以通过当前分类去找他的父idPid
        String path = courseType.getPath();
        //通过.分割成数组  .在正则表达式有特殊含义  所以需要转移
        String[] typeArr = path.split("\\.");

        List<Long> ids = new ArrayList<>();

        //遍历把path分割的数组，然后把每一个数据装到集合里
        for (String typeId : typeArr) {
            //装到集合里
            ids.add(Long.valueOf(typeId));
        }

        //传递一个集合--批量查询  得到courseType的一组数据
        List<CourseType> courseTypes = baseMapper.selectBatchIds(ids);

        //最终返回的数据
        List<CrumbsVo> crumbsVos = new ArrayList<>();

        //然后我们循环这个集合，每一个都是一个vo
        for (CourseType currentType : courseTypes) {
            CrumbsVo crumbsVo = new CrumbsVo();
            //把当前分类设置到vo里
            crumbsVo.setOwnerProductType(currentType);

            //设置他的兄弟姐妹
            //获取当前分类的父分类
            Long pid = courseType.getPid();
            //去数据库里面查和他相同的pid课程类型
            List<CourseType> otherProductTypes =  baseMapper.selectCourseByPid(pid);
            /*
            //从兄弟姐妹中删除自己
            //遍历拿到的兄弟姐妹
            for (CourseType otherProductType : otherProductTypes) {
                //如果当前分类的id 和兄弟姐妹中的某个id相等 删除
                if (courseTypeId == otherProductType.getId()){
                    //删除当前分类
                    otherProductTypes.remove(courseType);
                }
            }
            */
            //拿到他的兄弟姐妹，就把设置到vo里面
            crumbsVo.setOtherProductTypes(otherProductTypes);
            //每循环一个就往返回的结果添加一个课程类型
            crumbsVos.add(crumbsVo);
        }

        return crumbsVos;
    }
}
